package com.mrx.example.dao;

import com.mrx.example.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

/**
 * 最基本的 Dao 对象, 封装了一些有用的方法。所有 Dao 都应该从此类派生
 *
 * @author : Mr.X
 */
public abstract class BaseDao {
    /**
     * 使用 MyBatis 的 SqlSessionFactory
     */
    private final SqlSessionFactory sf;
    /**
     * 私有全局变量 session
     */
    private SqlSession session;

    /**
     * 初始化 SessionFactory
     *
     * @param clazz 要初始化的 Mapper
     */
    protected BaseDao(Class<?> clazz) {
        this.sf = MyBatisUtils.INSTANCE.getSqlSessionFactory(clazz);
    }

    /**
     * 关闭 SqlSession, 每次执行 查询后应关闭 Session
     *
     * @param commit 是否提交事务
     */
    protected final void closeSession(boolean commit) {
        if (session != null) {
            if (commit) {
                session.commit();
            }
            session.close();
            session = null;
        }
    }

    /**
     * 获取 Mapper 对象
     *
     * @param clazz 要获取的 Mapper
     * @param <T>   要获取的 Mapper 类型
     * @return 获取到的 Mapper
     */
    protected final <T> T getMapper(Class<T> clazz) {
        if (sf == null) {
            throw new IllegalStateException("请先初始化 SessionFactory!");
        }
        if (session == null) {
            session = sf.openSession(false);
        }
        return session.getMapper(clazz);
    }

}
